package com.heu.blood.match.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.heu.blood.application.entity.BloodApplicationItemEntity;
import com.heu.blood.application.vo.BloodApplicationVo;
import com.heu.blood.common.utils.PageUtils;
import com.heu.blood.match.dto.req.BloodTransfusionStateChangeReqDTO;
import com.heu.blood.match.dto.resp.MathchedPatientInformationRespDTO;
import com.heu.blood.match.dto.resp.SearchNewMatchBloodRespDTO;
import com.heu.blood.match.entity.BloodInformationEntity;
import com.heu.blood.match.entity.BloodMatchEntity;
import com.heu.blood.match.vo.*;
import org.apache.commons.lang3.tuple.Pair;

import java.util.List;
import java.util.Map;

/**
 * @author lyj
 * @email lyj@heu.com
 * @date 2023-06-16 00:23:13
 */
public interface BloodMatchService extends IService<BloodMatchEntity> {

    PageUtils queryPage(Map<String, Object> params);

    /**
     * 寻找符合条件血液进行配血
     * @param transfusionId
     * @return
     */
    List<BloodInformationEntity> search(String transfusionId);

    /**
     * 查询符合条件的配血信息，需要去除已经配过的和配血失败的
     * @param requestParam
     * @return
     */
    List<BloodInformationEntity> searchBlood(SearchNewMatchBloodRespDTO requestParam);

    /**
     * 条件查询交叉配血表信息
     * @param bloodMatchEntity
     */
    List<BloodMatchEntity> query(BloodMatchEntity bloodMatchEntity);

    /**
     * 根据配血单号查询配血记录表
     * @param matchId
     * @return
     */
    BloodMatchEntity queryByMatchId(String matchId);

    /**
     * 判定交叉配血是否成功
     * @param matchId
     * @return
     */
    Pair<Boolean, String> verify(String matchId);

    /**
     * 通过患者id来寻找所有配血成功的血液
     * @param patientId
     * @return
     */
    List<BloodMatchEntity> searchMatchedBlood(String patientId);

    /**
     * 根据患者id来查询患者配血表记录
     * @param patientId
     * @return
     */
    List<BloodMatchEntity> getByPatientId(String patientId);

    /**
     * 同时更改输血和血液信息表状态
     * @param requestParam 更改输血和血液状态入参
     * @return 是否更改成功
     */
    boolean changeBloodTransfusionState(BloodTransfusionStateChangeReqDTO requestParam);

    /**
     * 通过血液id查找符合条件的配血记录
     * @param bloodId 血液id
     * @return 符合条件的配血记录
     */
    List<BloodMatchEntity> searchBloodMathByBloodId(String bloodId);

    /**
     * 根据血液id获取配血人信息
     * @param bloodId 血液id
     * @return 匹配到的患者信息
     */
    List<MathchedPatientInformationRespDTO> searchMatchedPatientInformation(String bloodId);

    /**
     * 根据transfusionId查询所有配血成功的记录
     * @param transfusionId 输血申请单号
     * @return 配血成功的记录，已经发出去的血不需要了
     */
    List<BloodMatchEntity> searchSuccessMatched(String transfusionId);

    /**
    * @description: 该功能为患者维度的历史的配血记录进行查询
    * @param bloodMatchRecordQueryPatientDimensionVo
    * @return com.heu.blood.common.utils.PageUtils
    * @author lhh
    * @date 2024-07-15
    */
    
    PageUtils getBloodMatchRecordQueryPatientDimension(BloodMatchRecordQueryPatientDimensionVo bloodMatchRecordQueryPatientDimensionVo);

    /**
    * @description: 该功能为血袋维度的历史的配血记录进行查询
    * @param bloodMatchRecordQueryBagDimensionVo
    * @return com.heu.blood.common.utils.PageUtils
    * @author lhh
    * @date 2024-07-17
    */
    
    PageUtils getBloodMatchRecordQueryBagDimension(BloodMatchRecordQueryBagDimensionVo bloodMatchRecordQueryBagDimensionVo);

    /**
     * @description: 该功能为通过写死状态对血袋维度的历史的配血记录进行查询
     * @param bloodMatchRecordQueryBagDimensionVo
     * @return com.heu.blood.common.utils.PageUtils
     * @author lhh
     * @date 2024-07-17
     */
    PageUtils getBloodMatchRecordQueryBagDimensionByStatus(BloodMatchRecordQueryBagDimensionVo bloodMatchRecordQueryBagDimensionVo);

    Map<Long,List<BloodInformationEntity>> getAllBloodCanUse(BloodApplicationVo bloodApplicationVo);

    /**
     * 进行交叉配血的插入
     * @param bloodApplicationVo
     * @return
     */
    int insertBloodMatchInfo(BloodMatchInsertVO bloodApplicationVo);

    List<BloodMatchEntity> selectMatchListWithId(BloodMatchEntity bloodMatchEntity);

    List<BloodMatchWithBloodStateVo> selectMatchInfoWithBloodState(BloodMatchWithBloodStateVo bloodMatchEntity);

    List<BloodMatchEntity> selectMatchListWithApplicationItemId(Long bloodApplicationItemId);

    List<BloodMatchEntity> getMatchListWithBloodIdAndApplicationItem(String bloodId, String bloodApplicationItemId);

    BloodMatchAndSendVo getMatchAndSendInfo(BloodMatchEntity bloodMatchEntity);

    List<BloodInformationEntity> getAllBloodCanUseNoMatch(BloodApplicationItemEntity bloodApplicationItemEntity);

    int checkBloodTestResult(String applicationId);

    List<BloodMatchEntity> getMatchRecord(String patientId);
}

